/*
 * Copyright 2011-2012 Rivoli team
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.googlecode.rivoli.model.support

import com.googlecode.rivoli.RivoliException
import com.googlecode.rivoli.model.Element
import com.googlecode.rivoli.model.ElementDescriptor
import com.googlecode.rivoli.model.Model

abstract class ModelSupport implements Model {
	private Set<ElementDescriptor> elementDescriptors

	protected ModelSupport() {
		elementDescriptors = [] as Set
	}

	void init(Map<String, ?> parameters) {}

	protected void addElementDescriptor(ElementDescriptor elementDescriptor) {
		if (findElementDescriptor(elementDescriptor.name)) {
			throw new RivoliException("duplicate element descriptor: '${elementDescriptor.name}'")
		}

		elementDescriptors << elementDescriptor
	}

	Set<ElementDescriptor> getElementDescriptors() {
		Collections.unmodifiableSet(elementDescriptors)
	}

	private ElementDescriptor findElementDescriptor(String name) {
		elementDescriptors.find {it.name == name}
	}

	Element createElement(String name) throws RivoliException {
		ElementDescriptor elementDescriptor = findElementDescriptor(name)

		if (!elementDescriptor) {
			throw new RivoliException("unknown element descriptor: '${name}'")
		}

		new Element(elementDescriptor)
	}
}